﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Siser.Web.Models;

namespace Siser.Web.Controllers
{ 
    public class EmpleadoController : Controller
    {
        private SiserEntities db = new SiserEntities();

        //
        // GET: /Empleado/

        public ViewResult Index()
        {
            var empleados = db.Empleados.Include(e => e.Cargo).Include(e => e.Departamento).Include(e => e.Empresa);
            return View(empleados.ToList());
        }

        //
        // GET: /Empleado/Details/5

        public ViewResult Details(int id)
        {
            Empleado empleado = db.Empleados.Find(id);
            return View(empleado);
        }

        //
        // GET: /Empleado/Create

        public ActionResult Create()
        {
            ViewBag.CargoId = new SelectList(db.Cargos, "Id", "Nombre");
            ViewBag.DepartamentoId = new SelectList(db.Departamentos, "Id", "Nombre");
            ViewBag.EmpresaId = new SelectList(db.Empresas, "Id", "Nombre");
            return View();
        } 

        //
        // POST: /Empleado/Create

        [HttpPost]
        public ActionResult Create(Empleado empleado)
        {
            if (ModelState.IsValid)
            {
                db.Empleados.Add(empleado);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            ViewBag.CargoId = new SelectList(db.Cargos, "Id", "Nombre", empleado.CargoId);
            ViewBag.DepartamentoId = new SelectList(db.Departamentos, "Id", "Nombre", empleado.DepartamentoId);
            ViewBag.EmpresaId = new SelectList(db.Empresas, "Id", "Nombre", empleado.EmpresaId);
            return View(empleado);
        }
        
        //
        // GET: /Empleado/Edit/5
 
        public ActionResult Edit(int id)
        {
            Empleado empleado = db.Empleados.Find(id);
            ViewBag.CargoId = new SelectList(db.Cargos, "Id", "Nombre", empleado.CargoId);
            ViewBag.DepartamentoId = new SelectList(db.Departamentos, "Id", "Nombre", empleado.DepartamentoId);
            ViewBag.EmpresaId = new SelectList(db.Empresas, "Id", "Nombre", empleado.EmpresaId);
            return View(empleado);
        }

        //
        // POST: /Empleado/Edit/5

        [HttpPost]
        public ActionResult Edit(Empleado empleado)
        {
            if (ModelState.IsValid)
            {
                db.Entry(empleado).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.CargoId = new SelectList(db.Cargos, "Id", "Nombre", empleado.CargoId);
            ViewBag.DepartamentoId = new SelectList(db.Departamentos, "Id", "Nombre", empleado.DepartamentoId);
            ViewBag.EmpresaId = new SelectList(db.Empresas, "Id", "Nombre", empleado.EmpresaId);
            return View(empleado);
        }

        //
        // GET: /Empleado/Delete/5
 
        public ActionResult Delete(int id)
        {
            Empleado empleado = db.Empleados.Find(id);
            return View(empleado);
        }

        //
        // POST: /Empleado/Delete/5

        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            //verifica que empleado no sea encargado de una instalación.
            var listaEquipoEncargado = (from i in db.Instalaciones 
                                       join e  in db.Empleados on i.EncargadoId equals e.Id
                                       where i.EncargadoId == id
                                           select i).ToList();
        
            if (listaEquipoEncargado.Count == 0)//si no tiene instalación asociada se procede a eliminar coordenadas y tarjeta.
            {
                //selecciona coordenadas de segun tarjeta del empleado y las elimina.
                 var coordenadas = (from c in db.Coordenadas
                            join t in db.TarjetasIdentificaciones on c.TarjetaIdentificacionId equals t.Id
                            join u in db.Usuarios on t.UsuarioId equals u.Id
                            join e in db.Empleados on u.EmpleadoId equals e.Id
                            where e.Id==id
                            select c.Id).ToList();
                 foreach (var del in coordenadas)
                 {
                     Coordenada coordenada = db.Coordenadas.Find(del);
                     db.Coordenadas.Remove(coordenada);
                     db.SaveChanges();
                 }


                //selecciona tarjeta de identificacion del empleado y la elimina una vez borradas las coordendas.
                 var tarjetas = (from t in db.TarjetasIdentificaciones
                                        join u in db.Usuarios on t.UsuarioId equals u.Id
                                        join e in db.Empleados on u.EmpleadoId equals e.Id
                                        where e.Id == id
                                        select t.Id).ToList();
                 foreach (var del2 in tarjetas)
                 {
                     TarjetaIdentificacion Tarjeta = db.TarjetasIdentificaciones.Find(del2);
                     db.TarjetasIdentificaciones.Remove(Tarjeta);
                     db.SaveChanges();
                 }
                //eliminar ingresos transitorios del empleado al desactivarlo
                 var ingresos = (from i in db.ingresos_transitorios
                                 join u in db.Usuarios on i.usuario_id equals u.Id
                                 join e in db.Empleados on u.EmpleadoId equals e.Id
                                 where e.Id == id
                                 select i.id).ToList();
                 foreach (var del4 in ingresos)
                 {
                     ingresos_transitorios Transi = db.ingresos_transitorios.Find(del4);
                     db.ingresos_transitorios.Remove(Transi);
                     db.SaveChanges();
                 }
                //cambia la vigencia del usuario una vez seleccionada la eliminacion del empleado, quedan los registros de 
                //Usuario, sin vigencia. Empleado y usuarios-equipos en la BD.
                 var UsuarioEmpleado3 = (from u in db.Usuarios
                                        where u.EmpleadoId == id
                                        select u.Id).ToList();
                 foreach (var del3 in UsuarioEmpleado3)
                 {
                     Usuario usuario = db.Usuarios.Find(del3);
                     usuario.ContrasenaComparada = usuario.Contrasena;
                     usuario.Vigencia=false;
                     db.Entry(usuario).State = EntityState.Modified;
                     db.SaveChanges();
                 }
                 ViewBag.texto = "F";
                return RedirectToAction("Index");       
            }
            else //si tiene instalación asociada se redirige al index de instalacion para que pueda modificar el encargado.
            {
                ViewBag.texto ="V";
                return View();     
            } 
       
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}